/**
 * 恢复数字序列
 * 
 * 题目描述

对于一个连续正整数组成的序列，可以将其拼接成一个字符串，再将字符串里的部分字符打乱顺序。如序列8 9 10 11 12，拼接成的字符串为89101112，打乱一部分字符后得到90811211，原来的正整数10就被拆成了0和1。

现给定一个按如上规则得到的打乱字符的字符串，请将其还原成连续正整数序列，并输出序列中最小的数字。

输入描述
输入一行，为打乱字符的字符串和正整数序列的长度，两者间用空格分隔，字符串长度不超过200，正整数不超过1000，保证输入可以还原成唯一序列。

输出描述
输出一个数字，为序列中最小的数字。

用例
输入	19801211 5
输出	8
说明	无
 */

import java.util.Scanner;

/**
  * 
  题目解析
本题“打乱字符的字符串”的是由“连续正整数序列”组成的，而题目又说：正整数不超过1000

因此，本题可以考虑使用滑动窗口，在1~1000整数范围内滑动，滑窗窗口的长度为输入的“连续正整数序列”的长度。

我们只需要统计“打乱字符的字符串”中各字符的数量，以及滑窗中各字符的数量，如果所有字符对于的数量都相同，那么说明对应滑窗就是一个符合要求的连续正整数数列，我们只需要取滑窗第一个数值即可。

滑窗在运动过程中，可以利用差异比较，即当前滑窗相交于上一个滑窗，失去了一个数字，新增了一个数字，当前滑窗只需要针对失去数字和新增数字的字符做数量修改即可。

根据考友反馈，本题输入描述中说：正整数不超过1000，但是实际考试时，应该是不超过10000，因此下面代码实现中，将最大正整数改到了10000，大家注意下。
  */
public class 恢复数字序列 {

    public static void main(String[] args) {
        
        try{

            Scanner sc = new Scanner(System.in);
 
            String s = sc.next();
            int k = sc.nextInt();
    
            System.out.println(solution(s, k));

        }catch(Exception e){

            e.printStackTrace();
        }
    }

    public static int solution(String s, int k) {
        // 统计乱序字符串中各数字（0~9）的个数
        int[] count1 = new int[10];
        for (int i = 0; i < s.length(); i++) {
            count1[s.charAt(i) - '0']++;
        }
 
        // 统计连续正整数组成的序列中各数字（0~9）的个数
        int[] count2 = new int[10];
 
        // 滑窗长度固定为k, 初始滑窗范围 [1, k]
        for (int i = 1; i <= k; i++) {
            increase(count2, i);
        }
        // 若初始滑窗就符合要求, 则返回初始滑窗左边界元素1
        if (equals(count2, count1)) {
            return 1;
        }
 
        // 后续滑窗范围：[i-k+1, i]
        for (int i = k + 1; i <= 10000; i++) {
            increase(count2, i); // 相较于上一个滑窗新增 i
            decrease(count2, i - k); // 相较于上一个滑窗失去 i - k
 
            // 若滑窗符合要求, 则返回滑窗左边界 i-k+1
            if (equals(count2, count1)) {
                return i - k + 1;
            }
        }
 
        // 若找不到, 则返回-1, 本题说一定会有解, 所以此步走不到
        return -1;
    }
 
    public static boolean equals(int[] a, int[] b) {
        for (int i = 0; i < a.length; i++) {
            if (a[i] != b[i]) return false;
        }
        return true;
    }
 
    public static void increase(int[] count, int num) {
        while (num > 0) {
            count[num % 10]++;
            num /= 10;
        }
    }
 
    public static void decrease(int[] count, int num) {
        while (num > 0) {
            count[num % 10]--;
            num /= 10;
        }
    }
}
